/**
 * 发送GET请求
 * @param {string} url - 请求的地址
 * @param {function} funSuccess - 请求成功后的回调函数
 * @param {function} funFail - 请求失败后的回调函数
 */
function get(url, funSuccess, funFail) {
	// 显示加载动画
	uni.showLoading({
			title: '数据加载中……',
			mask: false
		}),

		// 发送GET请求
		uni.request({
			url,
			method: "GET",
			sslVerify: false,
			header: {
				"content-type": "application/json;charset=UTF-8"
			},
			success: res => {
				funSuccess(res.data)
			},
			fail: err => {
				funFail(err)
			},
			complete: () => {
				uni.hideLoading();
			}
		});
}


/**
 * 发送带有header的GET请求到指定的URL，并处理成功、失败和完成的情况。
 * 
 * @param {string} url - 要发送GET请求的URL。
 * @param {Object} header - 要与请求一起发送的header对象。
 * @param {Function} funSuccess - 成功回调函数，当请求成功时调用。
 * @param {Function} funFail - 失败回调函数，当请求失败时调用。
 * @param {Function} funComplete - 完成回调函数，不管请求成功或失败都会调用。
 */
function getWithHeader(url, header, funSuccess, funFail, funComplete) {
	// 显示加载动画
	uni.showLoading({
		title: '数据加载中……',
		mask: false
	});
	// 发送带有header的GET请求
	uni.request({
		url,
		header,
		method: "GET",
		sslVerify: false,
		success: res => {
			funSuccess(res.data)
		},
		fail: err => {
			funFail(err)
		},
		complete: () => {
			uni.hideLoading();
			funComplete();
		}
	});
}

/**
 * 发送带有自定义 header 的 POST 请求，用于向服务器发送数据
 * @param {string} url - 请求的 URL 地址
 * @param {Object} header - 自定义的请求头信息
 * @param {Object} data - 发送给服务器的数据
 * @param {Function} funSuccess - 请求成功后的回调函数，返回值为 res.data
 * @param {Function} funFail - 请求失败后的回调函数，返回值为 err
 * @param {Function} funComplete - 请求完成后的回调函数，无返回值
 * @returns {void}
 */
function postWithHeader(url, header, data, funSuccess, funFail, funComplete) {
	// 显示数据发送中的加载框
	uni.showLoading({
			title: '数据发送中……',
			mask: false
		}),
		// 发送带有 header 的 POST 请求
		uni.request({
			url,
			header,
			method: "POST",
			sslVerify: false,
			dataType: 'json',
			data,
			// 请求成功后的回调函数，将返回值传递给该函数进行处理
			success: res => {
				funSuccess(res.data)
			},
			// 请求失败后的回调函数，将错误信息传递给该函数进行处理
			fail: err => {
				funFail(err)
			},
			// 请求完成后的回调函数，隐藏加载框并执行该函数
			complete: () => {
				uni.hideLoading();
				funComplete();
			}
		});
}


/**
 * 发起 POST 请求，用于向服务器发送数据
 * @param {string} url - 请求的 URL 地址
 * @param {Object} data - 发送给服务器的数据
 * @param {Function} funSuccess - 请求成功后的回调函数，返回值为 res.data
 * @param {Function} funFail - 请求失败后的回调函数，返回值为 err
 * @param {Function} funComplete - 请求完成后的回调函数，无返回值
 * @returns {void}
 */
function post(url, data, funSuccess, funFail, funComplete) {
	// 发起 POST 请求
	uni.request({
		url,
		method: "POST",
		sslVerify: false,
		dataType: 'json',
		data,
		// 请求成功后的回调函数，将返回值传递给该函数进行处理
		success: res => {
			funSuccess(res.data)
		},
		// 请求失败后的回调函数，将错误信息传递给该函数进行处理
		fail: err => {
			funFail(err)
		},
		// 请求完成后的回调函数，执行该函数
		complete: () => {
			// uni.hideLoading();
			funComplete();
		}
	});
}


/**
 * 发起 POST 请求，用于提交表单数据
 * @param {string} url - 请求的 URL 地址
 * @param {Object} data - 发送给服务器的数据
 * @param {Function} funSuccess - 请求成功后的回调函数，返回值为 res.data
 * @param {Function} funFail - 请求失败后的回调函数，返回值为 err
 * @param {Function} funComplete - 请求完成后的回调函数，无返回值
 * @returns {void}
 */
function postParams(url, data, funSuccess, funFail, funComplete) {
	// 发起 POST 请求
	uni.request({
		url,
		// 设置请求头部
		header: {
			"accept": "aplication/json, */*;q=0.1",
			'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
		},
		method: "POST",
		sslVerify: false,
		dataType: 'json',
		data,
		// 请求成功后的回调函数，将返回值传递给该函数进行处理
		success: res => {
			funSuccess(res.data)
		},
		// 请求失败后的回调函数，将错误信息传递给该函数进行处理
		fail: err => {
			funFail(err)
		},
		// 请求完成后的回调函数，执行该函数
		complete: () => {
			funComplete();
		}
	});
}


/**
 * 发起 DELETE 请求，用于删除数据
 * @param {string} url - 请求的 URL 地址
 * @param {Object} data - 发送给服务器的数据
 * @param {Function} funSuccess - 请求成功后的回调函数，返回值为 res.data
 * @param {Function} funFail - 请求失败后的回调函数，返回值为 err
 * @param {Function} funComplete - 请求完成后的回调函数，无返回值
 * @returns {void}
 */
function deleteParams(url, data, funSuccess, funFail, funComplete) {
	// 显示加载动画
	uni.showLoading({
			title: '删除中……',
			mask: false
		}),
		// 发起 DELETE 请求
		uni.request({
			url,
			// 设置请求头部
			header: {
				"accept": "aplication/json, */*;q=0.1",
				'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
			},
			method: "DELETE",
			sslVerify: false,
			dataType: 'json',
			data,
			// 请求成功后的回调函数，将返回值传递给该函数进行处理
			success: res => {
				funSuccess(res.data)
			},
			// 请求失败后的回调函数，将错误信息传递给该函数进行处理
			fail: err => {
				funFail(err)
			},
			// 请求完成后的回调函数，隐藏加载动画，并执行该函数
			complete: () => {
				uni.hideLoading();
				funComplete();
			}
		});
}


/**
 * 上传文件的函数，使用 uni.uploadFile 方法
 * @param {string} url - 上传文件的地址
 * @param {string} name - 上传文件的字段名
 * @param {string} filePath - 要上传的文件路径
 * @param {Object} data - 上传文件时要附带的数据
 * @param {Function} funSuccess - 上传成功后的回调函数
 * @returns {void}
 */
function postFile(url, name, filePath, data, funSuccess) {
	// 调用 uni.uploadFile() 方法上传文件
	uni.uploadFile({
		// 上传文件的地址
		url,
		// 上传文件的字段名
		name,
		// 要上传的文件路径
		filePath,
		sslVerify: false,
		// 上传文件时要附带的数据
		formData: data,
		// 上传成功后的回调函数，将返回值传递给该函数进行处理
		success: (res) => funSuccess(res)
	})
}


/**
 * 异步请求函数，使用 Promise 封装 uni.request 方法
 * @param {string} url - 请求的地址
 * @param {Object} data - 请求的数据，默认为空对象
 * @param {string} method - 请求方法，默认为 GET
 * @returns {Promise} 返回一个 Promise 实例，该实例在异步操作成功时调用 resolve()，在失败时调用 reject()
 */
function requestAsync(url, data = {}, method = 'GET') {
	// 返回一个 Promise 实例，该实例在异步操作成功时调用 resolve()，在失败时调用 reject()
	return new Promise((resolve, reject) => {
		// 调用 uni.request() 方法发起网络请求
		uni.request({
			url, // 请求的地址
			method, // 请求方法，默认为 GET
			data, // 请求数据，默认为空对象
			sslVerify: false,
			success: res => {
				// 请求成功时的回调函数，调用 resolve() 并将返回值传递给 then() 方法的回调函数
				resolve(res)
			},
			fail: err => {
				// 请求失败时的回调函数，调用 reject() 并将错误信息传递给 catch() 方法的回调函数
				reject(err)
			},
			complete: () => {
				// 请求完成时的回调函数，不管请求成功或失败都会执行
				// 此处不需要进行任何处理，可以省略
			}
		})
	})
}

// 导出get和getWithHeader方法供其他模块使用
module.exports = {
	get,
	getWithHeader,
	post,
	postWithHeader,
	postParams,
	deleteParams,
	postFile,
	requestAsync
}